/*
 * 梅森尼数（4分）
 */

#include <stdio.h>
#include <math.h>

int main() {
	setbuf(stdout, NULL);

	// NOTE: Variable declaration
	int n, count=0;
	// HINT: 用双精度浮点型变量t实现对于2^x次方的存储
	double t = 2;


	// NOTE: Inputs
	printf("Input n:\n");
	scanf("%d", &n);


	// NOTE: Process
	for (int i = 2; i <= n; ++i) {
		// HINT: 每轮循环t步长乘一个2
		t *= 2;

		// HINT: 计算当前轮次下的形如2^i-1的数，存于x中
		double x = t - 1;

		// HINT: 设置标记变量x，用于判断x是否为素数的标记。只有始终为0才是素数。
		int flag = 0;

		// ALERT: 由于x随着代码运行，数值会以指数级增长。所以，必须用sqrt(x)简化验证素数的步骤，否则程序将超时。
		for (int j = 2; j <= sqrt(x); ++j) {
			// ALERT: 当i超过30以后，2^i-1的值会很大，不能用long型变量来存储，必须使用double类型来存储。对于double类型变量x（不是整型）不能执行求余运算，即不能用 x % i == 0来判断x是否能被i整除，可以使用 x / i == (int)(x/i)来判断x是否能被i整除。
			if (x / j == (int) (x / j)) {
				++flag;

				break;
			}
		}

		// HINT: x不是素数，不满足梅森尼数条件。舍弃该数
		if (flag) {
			continue;
		}

		// HINT: 当前轮次出现了一个梅森尼数，count自增1
		++count;

		// HINT: 输出x，及其形成过程
		printf("2^%d-1=%.0lf\n", i,x);
	}

	// NOTE: Outputs
	printf("count=%d\n",count);


	// NOTE: Ending
	return 0;
}